#include<iostream>
#include<opencv2/opencv.hpp>

void myshow(const cv::Mat img, std::string window_name) //任务一：显示图像
{
    cv::namedWindow(window_name,cv::WINDOW_FREERATIO);//创建一个可以调节大小的窗口
    cv::imshow(window_name,img);
}

cv::Mat my_gray(const cv::Mat img)  //任务二，将图片转化为灰度图像
{
    cv::Mat temp;
    cv::cvtColor(img, temp, cv::COLOR_RGB2GRAY);
    myshow(temp,"gray");
    return temp;
}

void handle(const cv::Mat img) //任务三 将图像进行二值化，腐蚀，膨胀。
{
    cv::Mat gray, binary_image, corrosion_image, expand_image; // 用于保存灰度图，二值图，腐蚀图，膨胀图

    gray = my_gray(img); // 先将我们的图片转化为灰度图像

    cv::threshold(gray, binary_image, 45, 255, cv::THRESH_BINARY); // 注意：一张图片二值化之前必须是灰度图像,适当调节阈值，可让4出现

    myshow(binary_image,"threshold");//显示二值图

    cv::Mat struct1 = cv::getStructuringElement(0, cv::Size(3, 3)); // 十字结构元素

    cv::erode(binary_image, corrosion_image, struct1);//腐蚀，腐蚀前这张图片必须是二值图

    myshow(corrosion_image, "corrosion_image");

    cv::dilate(binary_image,expand_image,struct1);

    myshow(expand_image, "expand_image");

}

void edge(const cv::Mat img) //任务四，边缘检测
{
    cv::Mat resultHigh, resultLow;
    Canny(img, resultHigh, 100, 200, 3);

    myshow(resultHigh, " resultHigh");

    Canny(img, resultLow, 20, 40, 3);

    myshow(resultLow, "resultLow");
}

void myplot(cv::Mat& img)
{
    cv::Mat temp = img;
    circle(temp, cv::Point(100, 50), 20, cv::Scalar(255, 255, 255), 4);

    putText(img, "qidian", cv::Point(100, 400), 2, 1, cv::Scalar(255, 255, 255));
}
int main()
{
   
    cv::Mat img = cv::imread("/home/qidian2021/task/hw2.jpg");
    if(img.empty())
    {
        std::cout << "图片不存在，或者路径出错！" << std::endl;
        return -1;
    }
    my_gray(img);
    handle(img);
    edge(img);
    myplot(img);
    myshow(img, "src");
    cv::waitKey(0);
    return 0;
}